package com.gadgets.framework.common.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 功能说明：
 *
 * @author Unclexiu
 * @version V202101.00.000
 * @data 2022-09-13
 * 修改记录：  修改日期          修改人员    修改说明
 * 2022-09-13  xiujunqing   创建文件
 */
public class FeginRequestMapUtil {

	protected static final Logger logger = LoggerFactory.getLogger(FeginRequestMapUtil.class);

	protected static final ConcurrentHashMap<String , Field[]> fieldMap = new ConcurrentHashMap<String , Field[]>();

	/**
	 * Fegin请求参数组装
	 * @param object	数据源
	 * @param fields	属性列表
	 * @param t			数据源类型
	 * @param <T>		类型泛型
	 * @param param 	参数容器
	 */
	public static <T> void parseRequestParam(T object, Field[] fields, Class<? extends T> t, HashMap<String, Object> param){
		for (Field field : fields) {
			field.setAccessible(true);
			String fieldName = field.getName();
			try {
				Object val = field.get(object);
				if(null!=val) {
					param.put(fieldName, val);
				}
			} catch (IllegalAccessException e) {
				logger.error("参数：{}，来自类：{}，属性获取失败，失败信息：{}", field.getName(), t.getName(), StringUtils.formatExceptionStack(e));
			}
		}
	}

	/**
	 * Fegin请求参数组装
	 * @param object	数据源
	 * @param <T>		类型泛型
	 * @param param 	参数容器
	 */
	public static <T> void parseRequestParam(T object, HashMap<String, Object> param){
		Class<?> t = object.getClass();
		String key = t.getCanonicalName();
		if(!fieldMap.containsKey(key)){
			fieldMap.put(key, t.getDeclaredFields());
		}
		parseRequestParam(object, fieldMap.get(key), t, param);
	}

}
